<!DOCTYPE html>
<html>
  <head>
    <title>奇門遁甲</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script language="JavaScript" src="_js/sprintf.min.js"></script>
    <style type="text/css">
    body  {position: relative;padding:0;margin:0}
    div   {position: relative}
    table {position: relative}
    form  {position: relative}
    tr    {position: relative;height: 7mm}
    td    {position: relative;padding:0}
    input, select {position: relative;top:0;left:0;right:0;bottom:0;width:100%;height:100%;border:0;padding:0}
    </style>
    <script language="javascript" src="_js/jquery.min.js"></script>
    <script language="javascript" src="_js/jiqi.js"></script>
    <script language="JavaScript" src="_js/lunar.js"></script>
    <script language="JavaScript" src="_js/qimen_min.js"></script>
    <script language="javascript">
    "use strict";
    var gbl_date = new Date();
    String.prototype.replaceAt=function(index, character) {
      return this.substr(0, index) + character + this.substr(index+character.length);
    };
    function gui_check_input_date(id) {
      "use strict";
      var patt1=/^[0-9]{4}[0-9]{2}[0-9]{2}-[0-9]{2}[0-9]{2}[0-9]{2}$/i;
      if(!id.match(patt1)) {
        return false;
      }
      var daysInMonth = [0,31,28,31,30,31,30,31,31,30,31,30,31];
      // If evenly divisible by 4 and not evenly divisible by 100,
      // or is evenly divisible by 400, then a leap year
      var y = (id.substr(0,4))*1;
      var m = (id.substr(4,2))*1;
      var d = (id.substr(6,2))*1;
      var h = (id.substr(9,2))*1;
      var i = (id.substr(11,2))*1;
      var s = (id.substr(13,2))*1;
      //console.log(y,m,d,h,i,s);
      if ( (!(y % 4) && y % 100) || !(y % 400)) {
        daysInMonth[2] = 29;
      }
      if(m < 1 || m > 12) return false;
      if(d < 1 || d > daysInMonth[m]) return false;
      if(h < 0 || h > 23) return false;
      if(i < 0 || i > 59) return false;
      if(s < 0 || s > 59) return false;
      return true;
    }
    function calc(){
      var id = $('input[name=txtDate]').val();
      if(gui_check_input_date(id) == false){
        alert('error format'); return;
      }
      var y = (id.substr(0,4))*1;
      var m = (id.substr(4,2))*1;
      var d = (id.substr(6,2))*1;
      var h = (id.substr(9,2))*1;
      var i = (id.substr(11,2))*1;
      var s = (id.substr(13,2))*1;
      gbl_date = new Date(y,m-1,d,h,i,s);
      // cal qimen;
      calc_qimen();
    }
    function calc_now() {
      gbl_date = null;
      gbl_date = new Date();
      calc_qimen();
    }
    function tuneDate(btn){
      var intxt = $(btn).val();
      var act = intxt[0];
      var idx = "年月日時分秒".indexOf(intxt[1]);
      if(!gbl_date) return;
      //
      if(act == '+') {
        if(idx == 0) { gbl_date.setDate(gbl_date.getDate() + 365);; }
        if(idx == 1) { gbl_date.setDate(gbl_date.getDate() + 30);; }
        if(idx == 2) { gbl_date.setDate(gbl_date.getDate() + 1);; }
        if(idx == 3) { gbl_date.setTime(gbl_date.getTime() + 3600000);; }
        if(idx == 4) { gbl_date.setTime(gbl_date.getTime() + 60000);; }
        if(idx == 5) { gbl_date.setTime(gbl_date.getTime() + 1000);; }
      } else {
        if(idx == 0) { gbl_date.setDate(gbl_date.getDate() - 365);; }
        if(idx == 1) { gbl_date.setDate(gbl_date.getDate() - 30);; }
        if(idx == 2) { gbl_date.setDate(gbl_date.getDate() - 1);; }
        if(idx == 3) { gbl_date.setTime(gbl_date.getTime() - 3600000);; }
        if(idx == 4) { gbl_date.setTime(gbl_date.getTime() - 60000);; }
        if(idx == 5) { gbl_date.setTime(gbl_date.getTime() - 1000);; }
      }
      calc_qimen();
    }
    function calc_qimen() {
      var d = new Date(gbl_date);
      var jiqi = QIMEN_STAR.jiqi.GetJiqiInfo(
        d.getFullYear(),d.getMonth()+1,d.getDate(),d.getHours(),d.getMinutes(),d.getSeconds(),0);
      //console.log(jiqi);
      //var out  = sprintf("%s\r\n",QIMEN_STAR.jiqi.JTime(jiqi.julian));
      var out  = sprintf("%s%03d\r\n",QIMEN_STAR.jiqi.JTime(jiqi.julian),d.getMilliseconds());
          (function() {
            var lunar = QIMEN_STAR.Solar2Lunar(d.getFullYear(),d.getMonth()+1,d.getDate(),d.getHours(),d.getMinutes(),d.getSeconds());
            // 計當下月將
            var _arrGen = new Array;
            for(var i = 2; i < 25; i+=2) {
              _arrGen.push(jiqi.wholeYear[i-1]);
            }
            var _gen = 11;
            for(var i = 0; i < 12; i++) {
              ////console.log(jiqi.jq0[(11-i)*2+1]);
              if(jiqi.julian > _arrGen[11 - i]) {
                _gen = 11 - i;
                break;
              }
            }
            // 計算日期
            var ldate = lunar.substring(lunar.indexOf('月')+1,lunar.indexOf('日'));
            ldate = parseInt(ldate);
            var ldate2 = sprintf("%02d%02d%02d",parseInt(ldate),d.getHours(),d.getMinutes());ldate2 = parseInt(ldate2);
            var idxLst = (function(ld) {
              var lst = [0,21730,50430,71530,100230,121330,150030,171130,192230,220930,242030,270330,291830];
              var idx = 0;
              for(var i = 13; i > 0; i--) if(lst[i] < ld) { idx = i; break }
              var astro = "亥戌酉申未午巳辰卯寅丑子亥戌酉申未午巳辰卯寅丑子".substr(_gen,12);
              return sprintf("%s:%d",astro[idx%12],idx % 12);
              })(ldate2);
            //
            out += sprintf("%s, %s\r\n",lunar,idxLst);
          })();
          var cjiqi = jiqi.currentJiqiIdx - 1; if(cjiqi < 0) cjiqi = 23;
          out += sprintf("當前節氣: %s, %s\r\n",jiqi.jiqi[cjiqi],QIMEN_STAR.jiqi.JTime(jiqi.wholeYear[cjiqi]));
      // 排四柱
      var tcol0 = new Array;
      var dcol0 = new Array;
      for(var i = 6; i > -1 ; i -= 2) tcol0.push(jiqi.bazi[i]);
      for(var i = 7; i > -1 ; i -= 2) dcol0.push(jiqi.bazi[i]);
      //
      // 計時家奇門三元
      var idx1 =  "甲乙丙丁戊己庚辛壬癸".indexOf(jiqi.bazi[4]);
      var idx2 = "子丑寅卯辰巳午未申酉戌亥".indexOf(jiqi.bazi[5]);
      idx2 = idx2 - idx1 % 5;
      if(idx2 < 0) idx2 += 12;
      idx2 = idx2 % 3;
      if(idx2 > 0) {
        idx2 = (idx2 == 1)? 2 : 1;
      }
      out += jiqi.jiqi[cjiqi]+"上中下".charAt(idx2)+"元　";
      // 計算當前局數
      // 計陰陽遁
      var dun_type = 2; // 0為陰遁, 1為陽遁, 其餘為錯誤
      var kook = [8,9,1,3,4,5,4,5,6,9,8,7,2,1,9,7,6,5,6,5,4,1,2,3]; // 局數
      var using_kook = kook[cjiqi];  //局數
      //console.log(jtoday, jqTime[21], jqTime[9]);
      if( jiqi.julian > jiqi.wholeYear[9] && jiqi.julian < jiqi.wholeYear[21]) {
        // 陰遁
        dun_type = 0;
        for(var i = 0; i < idx2; i++) {
          using_kook -= 6;
          while(using_kook < 1) using_kook += 9;
        }
      } else {
        // 陽遁
        dun_type = 1;
        for(var i = 0; i < idx2; i++) {
          using_kook += 6;
          while(using_kook > 9) using_kook -= 9;
        }
      }
      if($('#cboDun').val() < 2) dun_type = $('#cboDun').val();
      if($('#cboKook').val() > 0) using_kook = $('#cboKook').val();
      //console.log("using_kook",using_kook);
      out += "陰陽".charAt(dun_type)+"遁"+" 一二三四五六七八九".charAt(using_kook)+"局"+"\r\n";
      // 輸出柱名
      out += "　　　";
      //for(var i = 0; i < jiqi.bazi.length; i+=2) {
      for(var i = 0; i < 12; i+=2) {
        out += "　"+"　年　月　日　時　分　秒毫秒不知未明疑問".substr(i,2);
      } out += "\r\n";
      // 輸出八字
      out += ("八字：");
      //for(var i = 0; i < jiqi.bazi.length; i += 2) out+=("　"+jiqi.bazi.substr(i, 2));
      for(var i = 0; i < 12; i += 2) out+=("　"+jiqi.bazi.substr(i, 2));
      out+=("\r\n");
      // 計空亡
      out += ("空亡：");
      for(var i = 0; i < 12; i += 2) {
        var chun_sau = "子丑寅卯辰巳午未申酉戌亥".indexOf(jiqi.bazi[i+1]) - "甲乙丙丁戊己庚辛壬癸".indexOf(jiqi.bazi[i]);
        if(chun_sau < 0) chun_sau += 12;
        var hung_mon = chun_sau - 2;
        if(hung_mon < 0) hung_mon += 12;
        out += ("　"+"子丑寅卯辰巳午未申酉戌亥".substr(hung_mon, 2));
      }
       out += ("\r\n");
       
      // ---
      // 計算時家奇門遁甲
      // ---
      var ot = $('#tpltable').text().split("\n");
      var q1 = QIMEN_STAR.qimenCalc(dun_type,using_kook,jiqi.bazi.substr(6,2));
      //var q2 = QIMEN_STAR.minQimen(d.getHours(),d.getMinutes(),d.getSeconds());
      out += sprintf("值符：天%s\r\n", q1['info']['符']);
      //out += sprintf("秒家：干支:%s, %s遁%s局\r\n", q2['info']['干支'],q2['info']['遁'],q2['info']['局']);
      // setup info 
      $('#info').html(out);
      //
      var gn = {'符':'值符','蛇':'騰蛇','陰':'太陰','合':'六合','白':'白虎','玄':'玄武','地':'九地','天':'九天'};
      var idx = [[12,7],[2,12],[7,2],[2,2],[7,7],[12,12],[7,12],[12,2],[2,7]];
      for(var i = 0; i < 9; i++) {
        var sy = idx[i][0], sx = idx[i][1];
        // 時家奇門
        ot[sy+3] = ot[sy+3].replaceAt(sx+3,q1['地'][i+1]);
        if(i == 4) continue;
        ot[sy+0] = ot[sy+0].replaceAt(sx+2,'門');
        ot[sy+0] = ot[sy+0].replaceAt(sx+1,q1['門'][i+1]);
        if(i != 4)ot[sy+1] = ot[sy+1].replaceAt(sx+1,gn[q1['神'][i+1]]);
        
        
        ot[sy+2] = ot[sy+2].replaceAt(sx+1,'天');
        ot[sy+2] = ot[sy+2].replaceAt(sx+2,q1['星'][i+1]);
        
        ot[sy+2] = ot[sy+2].replaceAt(sx+3,q1['天'][i+1]);
        
        
        /**
        // 秒家奇門
        ot[sy+2] = ot[sy+2].replaceAt(sx+1,q2['門'][i+1]);
        ot[sy+2] = ot[sy+2].replaceAt(sx+2,q2['神'][i+1]);
        ot[sy+2] = ot[sy+2].replaceAt(sx+3,q2['天'][i+1]);
        ot[sy+3] = ot[sy+3].replaceAt(sx+2,q2['星'][i+1]);
        ot[sy+3] = ot[sy+3].replaceAt(sx+3,q2['地'][i+1]);
        **/
        
      }
      // 建立空亡符號
      (function() {
        var abc = jiqi.bazi.substr(6,2)
        var chun_sau = "子丑寅卯辰巳午未申酉戌亥".indexOf(abc[1]) - "甲乙丙丁戊己庚辛壬癸".indexOf(abc[0]);
        if(chun_sau < 0) chun_sau += 12;
        var hung_mon = chun_sau - 2;
        if(hung_mon < 0) hung_mon += 12;
        // 建立空亡符號
        var idx = [[12,7],[2,12],[7,2],[2,2],[7,7],[12,12],[7,12],[12,2],[2,7]];
        var a = "077233811655".charAt(hung_mon);
        var sy = idx[a][0], sx = idx[a][1];
        ot[sy+0] = ot[sy+0].replaceAt(sx+0,'Ｏ');
        var a = "077233811655".charAt(hung_mon+1);//console.log(a)
        var sy = idx[a][0], sx = idx[a][1];
        ot[sy+0] = ot[sy+0].replaceAt(sx+0,'Ｏ');
      })();
      // 計貴人
      (function() {
        // 計當下月將
        var _arrGen = new Array;
        for(var i = 2; i < 25; i+=2) {
          _arrGen.push(jiqi.wholeYear[i-1]);
        }
        var _gen = 11;
        for(var i = 0; i < 12; i++) {
          ////console.log(jiqi.jq0[(11-i)*2+1]);
          if(jiqi.julian > _arrGen[11 - i]) {
            _gen = 11 - i;
            break;
          }
        }
        // 月將加時
        var _ginmon = "子丑寅卯辰巳午未申酉戌亥".indexOf("亥戌酉申未午巳辰卯寅丑子".charAt(_gen));  // 找月將index
        var _gmonth = "子丑寅卯辰巳午未申酉戌亥".indexOf(dcol0[0]); //月將加時index
        var _gg = _ginmon - _gmonth;
        if(_gg < 0) _gg+= 12;
        var gnm = "子丑寅卯辰巳午未申酉戌亥子丑寅卯辰巳午未申酉戌亥".substr(_gg,12); // 月將加時天盤
        var _gen_text = "亥戌酉申未午巳辰卯寅丑子".charAt(_gen);
        var _dnt = gnm.indexOf(_gen_text);
        var day_night_tin = "卯辰巳午未申酉戌亥子丑寅";
        var day_night_tin = day_night_tin.indexOf("子丑寅卯辰巳午未申酉戌亥".charAt(_dnt));
        var tin_idx  = "甲乙丙丁戊己庚辛壬癸".indexOf(tcol0[1]);
        var help_man;
        if(day_night_tin < 6) { // 日貴人
          var help_man = "丑子亥亥丑子丑午巳巳".charAt(tin_idx);
        } else { //夜貴人
          var help_man = "未申酉酉未申未寅卯卯".charAt(tin_idx);
        }
        var help_man2;
        var _tmp  = gnm.indexOf(help_man); //console.log(gnm.charAt(_tmp));
        var _tmp2 = "子丑寅卯辰巳午未申酉戌亥".charAt(_tmp);
        var day_night_dei = "亥子丑寅卯辰巳午未申酉戌".indexOf(_tmp2);//console.log(_tmp2,":",day_night_dei);
        var _start_at = 12 - _tmp; if(_start_at == 0) _start_at = 12;
        //console.log(day_night_dei,': ',_start_at);
        if(day_night_dei < 6) { // 順貴人
          var help_man2 = "貴蛇朱合勾青空白常玄陰后貴蛇朱合勾青空白常玄陰后貴蛇朱合勾青空白常玄陰后".substr(_start_at, 12);
        } else { //逆貴人
          var help_man2 = "后陰玄常白空青勾合朱蛇貴后陰玄常白空青勾合朱蛇貴后陰玄常白空青勾合朱蛇貴".substr(_start_at-1, 12);
        }
        // dump 貴人
        //console.log('天盤:',gnm);
        //console.log('貴人:',help_man2);
        var xy = [[17,8],[17,3],[13,0],[8,0],[3,0],[0,3],[0,8],[0,13],[3,17],[8,17],[13,17],[17,13]];
        for(var i = 0; i< 12; i++) {
          var x = xy[i][1], y = xy[i][0];
          ot[y] = ot[y].replaceAt(x, gnm[i]);
        }
        var xy = [[17,9],[17,4],[14,0],[9,0],[4,0],[0,4],[0,9],[0,14],[4,17],[9,17],[14,17],[17,14]];
        for(var i = 0; i< 12; i++) {
          var x = xy[i][1], y = xy[i][0];
          ot[y] = ot[y].replaceAt(x, help_man2[i]);
        }
      })();
      $('#output').html(ot.join("\n"));
    }
    $(document).ready(calc_qimen);
    </script>
  </head>
  <body>
    <div>
      <form onsubmit="return false">
        <table border="0" cellpadding="0" cellspacing="0" width="100%" style="display:none" id='frmInput'>
          <tr>
            <td colspan="4">
              <input type="text" name="txtDate" style='border:1' />
            </td>
            <td>
              <input type="button" value="當下" onclick="$('#cboDun :nth-child(1)').prop('selected', true);$('#cboKook :nth-child(1)').prop('selected', true);calc_now()" />
            </td>
            <td>
              <input type="button" value="計算" onclick="calc()" />
            </td>
          </tr>
          <tr>
            <td colspan='2'><select id='cboDun' style='height:100%;width:100%'>
              <option value='2' selected>自動遁數</option>
              <option value='0'>陰遁</option>
              <option value='1'>陽遁</option>
              </select>
              </td>
            <td colspan='2'><select id='cboKook' style='height:100%;width:100%'>
              <option value='0' selected>自動局數</option>
              <option value='1'>一局</option>
              <option value='2'>二局</option>
              <option value='3'>三局</option>
              <option value='4'>四局</option>
              <option value='5'>五局</option>
              <option value='6'>六局</option>
              <option value='7'>七局</option>
              <option value='8'>八局</option>
              <option value='9'>九局</option>
              </select>
              </td>
            <td colspan='2'><input type='button' style='height:100%;width:100%' value='重算' onclick='calc_qimen();'>
              </td>
          </tr>
          <tr>
            <script language="JavaScript">
            (function() {
              var a = ['年','月','日','時','分','秒'];
              for(var i in a) {
                document.write(
                  sprintf('<td><input type="button" value="+%s" onclick="tuneDate(this)" /></td>',a[i])
                );
              }
            })();
            </script>
          </tr>
          <tr>
            <script language="JavaScript">
            (function() {
              var a = ['年','月','日','時','分','秒'];
              for(var i in a) {
                document.write(
                  sprintf('<td><input type="button" value="-%s" onclick="tuneDate(this)" /></td>',a[i])
                );
              }
            })();
            </script>
          </tr>
        </table>
        <div onclick="$('#frmInput').toggle()"><pre id="info"></pre></div>
        <div><pre id="output"></pre></div>
        <pre style="visibility:hidden" id="tpltable">＋　　　　　｜　　　　｜　　　　　＋
　＋－－－－＋－－－－＋－－－－＋　
　｜　　　　｜　　　　｜　　　　｜　
　｜　　　　｜　　　　｜　　　　｜　
　｜　　　　｜　　　　｜　　　　｜　
　｜　　　　｜　　　　｜　　　　｜　
－＋－－－－＋－－－－＋－－－－＋－
　｜　　　　｜　　　　｜　　　　｜　
　｜　　　　｜　　　　｜　　　　｜　
　｜　　　　｜　　　　｜　　　　｜　
　｜　　　　｜　　　　｜　　　　｜　
－＋－－－－＋－－－－＋－－－－＋－
　｜　　　　｜　　　　｜　　　　｜　
　｜　　　　｜　　　　｜　　　　｜　
　｜　　　　｜　　　　｜　　　　｜　
　｜　　　　｜　　　　｜　　　　｜　
　＋－－－－＋－－－－＋－－－－＋　
＋　　　　　｜　　　　｜　　　　　＋</pre>
      </form>
    </div>
  </body>
</html>